/* 
 * File:   client_Trabajador.cpp
 * Author: maximiliano
 * 
 * Created on May 22, 2013, 1:20 PM
 */

#include "client_Trabajador.h"
#include "client_Cliente.h"
#include "client_Trabajo.h"

using namespace TP;

Trabajador::Trabajador(){
}

Trabajador::~Trabajador() {
}

void Trabajador::trabajar(const string& pIp, const string& pPuerto, std::ostream& pOstream) throw (Excepcion&){

    try
    {
        /* Instancio el cliente con la informacion de conexion al servicio e
         * inicio la conexion.
         */
        Cliente cliente (pIp, pPuerto, pOstream);
        cliente.Iniciar();
        
        /* Instancio una unidad de trabajo (solicitandola al servicio de 
         * criptografia. 
         */
        Trabajo* trabajo= new Trabajo();
        cliente.getJobPart(trabajo);
        
        if (trabajo->habilitado())
        {
            trabajo->iniciar();
            this->procesarClaves (trabajo, &cliente);
            cliente.jobPartFinished(trabajo->getNumeroProceso());
        }
        
        delete trabajo;
        cliente.Finalizar();
    }
    catch (Excepcion &ex)
    {
        throw ex;
    }
}

void Trabajador::procesarClaves (Trabajo* pTrabajo, Cliente* pCliente) throw (Excepcion&){

    // Itero las claves y cuando las encuentro las notifico al servicio.
    //
    
    while (pTrabajo->quedanClaves())
    {
        string* clave = pTrabajo->getClave();
        if (NULL != clave)
        {
            pCliente->setPosibleClave (*clave);
            delete clave;
        }
    }
}

